#ifndef PAGE_CACHE_H_V3
#define PAGE_CACHE_H_V3

#include "Common.h"
#include <map>
#include <mutex>

using namespace std;

namespace memoryPoolV3 {
class PageCache {
public:
    static const size_t PAGE_SIZE = 4096;

    static PageCache &getInstance() {
        static PageCache instance;
        return instance;
    }

    // 分配指定页数的span
    void *allocateSpan(size_t numPages);

    // 释放span
    void deallocateSpan(void *ptr, std::size_t numPages);

private:
    PageCache() = default;

    // 向系统申请内存
    void *systemAlloc(size_t numPages);

private:
    struct Span {
        void *pageAddr;       // 页起始地址
        std::size_t numPages; // 页数
        Span *next;           // 指针
    };

    std::map<std::size_t, Span *> freeSpans_; // 按页数管理空闲Span，不同页数对应不同Span链表
    std::map<void *, Span *> spanMap_;        // 页号到span的映射，用于回收
    std::mutex mutex_;
};
} // namespace memoryPoolV3
#endif